/**
 * @param {number[]} nums
 * @return {number[][]}
 */
 var threeSum = function(nums) {
  let len = nums.length // 获得数组的长度
  nums.sort((a,b)=>a - b)  // 对数组进行升序排序
  let res = [] // 结果数组
  for(let i = 0;i < len;i++){
     if(nums[i] > 0) return res // 如果这个nums[i]大于0 那么后面都是比他大的,所以就没必要继续遍历了
     if(i > 0 && nums[i] === nums[i-1]) continue // 如果这个数字和前面的相同 那就调过 因为不能有重复的
     let left = i + 1
     let right = len - 1
     while(left < right){
        // 当左小于右 那就判断这个三个数的和和0的关系
        let sum = nums[left] + nums[right] + nums[i]
        if(sum > 0){ // 如果和大于0 就让这个right--
           right--
        }else if (sum < 0){ // 如果和小于0  就上left++
           left++
        }else{
           res.push([nums[i],nums[left],nums[right]])
           while(left < right && nums[left] === nums[left+1]){ // 判断右边的left和左边的是不是相同 相同就移动left
              left++
           }
           while(left < right && nums[right] === nums[right-1]){
              right--
           }
           // 退出循环之后 left还是和之前的相同 所以要让left++ right--
           left++
           right--
        }
     }
  }
  return res // 返回结果
};